Optimize the Linux arch xen implementation of "set_pte_at".
authoriap10@freefall.cl.cam.ac.uk <iap10@freefall.cl.cam.ac.uk>
Sat, 13 Aug 2005 21:26:49 +0000 (21:26 +0000)
committeriap10@freefall.cl.cam.ac.uk <iap10@freefall.cl.cam.ac.uk>
Sat, 13 Aug 2005 21:26:49 +0000 (21:26 +0000)
Signed-off-by: ian@xensource.com
linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h
linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-3level.h
linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h

index 91f13540480a682f0f1a0c19f0f3f6c6a88a6dc0..1ed6625fff41b0750ff28f341ca9da30ed6308a7 100644 (file)
  * hook is made available.
  */
 #define set_pte(pteptr, pteval) (*(pteptr) = pteval)
-#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
+
+inline static void set_pte_at(struct mm_struct *mm, unsigned long addr, 
+                      pte_t *ptep, pte_t val )
+{
+    if ( ((mm != current->mm) && (mm != &init_mm)) ||
+        HYPERVISOR_update_va_mapping( (addr), (val), 0 ) )
+    {
+        set_pte(ptep, val);
+    }
+}
+
 #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval)
 
 #ifndef CONFIG_XEN_SHADOW_MODE
index 601a48e7f86385b423316635bfdbef8f1b2b0562..16079faf2a9652a40b70e049663c68bc1a2fd7b0 100644 (file)
@@ -68,7 +68,16 @@ static inline void set_pte(pte_t *ptep, pte_t pte)
                xen_l1_entry_update((pteptr), (pteval))
 # define set_pte_atomic(pteptr,pteval) set_pte(pteptr,pteval)
 #endif
-#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
+
+inline static void set_pte_at(struct mm_struct *mm, unsigned long addr, 
+                      pte_t *ptep, pte_t val )
+{
+    if ( ((mm != current->mm) && (mm != &init_mm)) ||
+        HYPERVISOR_update_va_mapping( (addr), (val), 0 ) )
+    {
+        set_pte(ptep, val);
+    }
+}
 
 #ifdef CONFIG_XEN_SHADOW_MODE
 # define set_pmd(pmdptr,pmdval) \
index 59cdcce1f2bf575d2f43fb08bbb70411af27257e..89dc994bf5005790d097f9fc7f7e2c559172935f 100644 (file)
@@ -265,7 +265,16 @@ static inline unsigned long pud_bad(pud_t pud)
        val &= ~(_PAGE_USER | _PAGE_DIRTY); 
        return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);      
 } 
-#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
+
+inline static void set_pte_at(struct mm_struct *mm, unsigned long addr, 
+                      pte_t *ptep, pte_t val )
+{
+    if ( ((mm != current->mm) && (mm != &init_mm)) ||
+        HYPERVISOR_update_va_mapping( (addr), (val), 0 ) )
+    {
+        set_pte(ptep, val);
+    }
+}
 
 #define pte_none(x)    (!(x).pte)
 #define pte_present(x) ((x).pte & (_PAGE_PRESENT | _PAGE_PROTNONE))